package br.com.iswe.gerador.velocity.helper;

import java.util.HashMap;
import java.util.Map;

import br.com.iswe.gerador.velocity.gerador.GeradorGenerico;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorConstansInterface;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorConstansProperties;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorConsultarPanel;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorDetalhePanel;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorDetalhePanelImpl;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorEntryPoint;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorEntryPointModule;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorFiltroPanel;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorFiltroPanelImpl;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorForm;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorFormImpl;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorGwt;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorHtml;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorListaDetailPanel;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorListaManyToManyPanel;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorListaPanel;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorListaPanelImpl;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorLookUp;
import br.com.iswe.gerador.velocity.gerador.gwt.GeradorService;
import br.com.iswe.gerador.velocity.info.InfoEntidadeImpl;

public class GwtHelper {
	public static final String HELPER_NAME = "GwtHelper";
	
	private Map<String, GeradorGenerico> geradores = new HashMap<String, GeradorGenerico>();
	
	public GwtHelper(){
		geradores.put(GeradorGwt.NOME_GERADOR, new GeradorGwt());
		geradores.put(GeradorListaManyToManyPanel.NOME_GERADOR, new GeradorListaManyToManyPanel());
		geradores.put(GeradorHtml.NOME_GERADOR, new GeradorHtml());
		geradores.put(GeradorListaDetailPanel.NOME_GERADOR, new GeradorListaDetailPanel());
		geradores.put(GeradorEntryPoint.NOME_GERADOR, new GeradorEntryPoint());
		geradores.put(GeradorDetalhePanel.NOME_GERADOR, new GeradorDetalhePanel());
		
		geradores.put(GeradorListaPanel.NOME_GERADOR, new GeradorListaPanel());
		geradores.put(GeradorListaPanelImpl.NOME_GERADOR, new GeradorListaPanelImpl());
		
		geradores.put(GeradorConsultarPanel.NOME_GERADOR, new GeradorConsultarPanel());
		geradores.put(GeradorFiltroPanel.NOME_GERADOR, new GeradorFiltroPanel());
		geradores.put(GeradorConstansInterface.NOME_GERADOR, new GeradorConstansInterface());
		geradores.put(GeradorConstansProperties.NOME_GERADOR, new GeradorConstansProperties());
		geradores.put(GeradorForm.NOME_GERADOR, new GeradorForm());
		geradores.put(GeradorService.NOME_GERADOR, new GeradorService());
		geradores.put(GeradorDetalhePanelImpl.NOME_GERADOR, new GeradorDetalhePanelImpl());
		geradores.put(GeradorFiltroPanelImpl.NOME_GERADOR, new GeradorFiltroPanelImpl());
		geradores.put(GeradorFormImpl.NOME_GERADOR, new GeradorFormImpl());
		geradores.put(GeradorEntryPointModule.NOME_GERADOR, new GeradorEntryPointModule());
		geradores.put(GeradorLookUp.NOME_GERADOR, new GeradorLookUp());
		
	}
	
	private Map<String, Object> parametrosGerador = new HashMap<String, Object>();
	
	public void addParametro(String nome, Object valor){
		parametrosGerador.put(nome, valor);
	}
	
	/**
	 * Chama o gerador passando a entidade como parametro.
	 * @param nomeGerador
	 * @param infoEntidade
	 * @throws Exception 
	 */
	public void generate(String nomeGerador, InfoEntidadeImpl infoEntidade) throws Exception{
		//efetua o log da operacao
		System.out.println("GwtHelper.generate() nomeGerador: " + nomeGerador + " " +
				"InfoEntidadeImpl.getEntidade().getName(): " + infoEntidade.getEntidade().getName());
		
		if(infoEntidade == null){
			return;
		}
		//Ontem o gerador
		GeradorGenerico gerador = geradores.get(nomeGerador);
		if(gerador == null){
			throw new RuntimeException("O Gerador: " + nomeGerador + " nao existe!");
		}
		gerador.setParametros(parametrosGerador);
		gerador.inicio(infoEntidade.getInfoGerador());
		gerador.gerarCodigo(infoEntidade);
		gerador.fim();
		
		parametrosGerador.clear();
	}
	
	
}
